package com.sky.controller.admin;

import com.sky.constant.MessageConstant;
import com.sky.dto.OrderPageQueryDTO;
import com.sky.dto.OrderConfirmDTO;
import com.sky.dto.OrderRejectionDTO;
import com.sky.dto.OrderCancelDTO;
import com.sky.result.PageBean;
import com.sky.result.Result;
import com.sky.service.OrderService;
import com.sky.vo.OrderStatisticsVO;
import com.sky.vo.OrderVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 订单管理
 */
@RestController("adminOrderController")
@RequestMapping("/admin/order")
@Slf4j
@Api(tags = "订单管理接口")
public class OrderController {

    @Autowired
    private OrderService orderService;

    /**
     * 分页、条件查询订单
     *
     * @param orderPageQueryDTO 查询条件、分页条件
     * @return 符合要求的订单集合
     */
    @GetMapping("/conditionSearch")
    public Result<PageBean> pageByCondition(OrderPageQueryDTO orderPageQueryDTO) {
        // 记录日志
        log.info("分页、条件查询订单，分页和查询参数为：{}", orderPageQueryDTO);

        // 参数校验

        // 调用service获取返回值，并给出响应
        PageBean pageBean = orderService.pageByCondition(orderPageQueryDTO);
        return Result.success(pageBean);
    }

    /**
     * 查询并统计各个状态的订单数量统计
     *
     * @return 各个状态的订单的数量
     */
    @GetMapping("/statistics")
    public Result<OrderStatisticsVO> statisticsByStatus() {
        // 记录日志
        log.info("查询并统计各个状态的订单数量统计");

        // 参数校验

        // 调用service获取返回值，并给出响应
        OrderStatisticsVO orderStatisticsVO = orderService.statisticsByStatus();
        return Result.success(orderStatisticsVO);
    }

    /**
     * 根据id查询订单（含详情）
     *
     * @param id 订单id
     * @return 订单（含详情）
     */
    @GetMapping("/details/{id}")
    public Result<OrderVO> findByIdWithDetails(@PathVariable("id") Long id) {
        // 记录日志
        log.info("根据id查询订单（含详情），订单id为：{}", id);

        // 参数校验

        // 调用service获取返回值，并给出响应
        return Result.success(orderService.findByIdWithDetails(id));
    }

    /**
     * 商家接单
     *
     * @param ordersConfirmDTO 订单id和目标状态
     * @return 是否接单成功
     */
    @PutMapping("/confirm")
    public Result confirmById(@RequestBody OrderConfirmDTO ordersConfirmDTO) {
        // 记录日志
        log.info("商家接单，订单信息为：{}", ordersConfirmDTO);

        // 参数校验

        // 调用service获取返回值，并给出响应
        if (orderService.confirmById(ordersConfirmDTO)) {
            return Result.success(MessageConstant.ORDER_CONFIRM_SUCCESS);
        }
        return Result.error(MessageConstant.ORDER_CONFIRM_FAIL);
    }

    /**
     * 商家拒单
     *
     * @param orderRejectionDTO 订单id和拒单原因
     * @return 拒单是否成功
     */
    @PutMapping("/rejection")
    public Result rejectionById(@RequestBody OrderRejectionDTO orderRejectionDTO) throws Exception {
        // 记录日志
        log.info("商家拒单，订单id和拒单原因为：{}", orderRejectionDTO);

        // 参数校验

        // 调用service获取返回值，并给出响应
        if (orderService.rejectionById(orderRejectionDTO)) {
            return Result.success(MessageConstant.ORDER_Rejection_SUCCESS);
        }
        return Result.error(MessageConstant.ORDER_Rejection_FAIL);
    }

    /**
     * 管理端取消订单
     *
     * @param orderCancelDTO 订单id和取消原因
     * @return 是否取消成功
     * @throws Exception 退款相关异常
     */
    @PutMapping("/cancel")
    public Result cancelById(@RequestBody OrderCancelDTO orderCancelDTO) throws Exception {
        // 记录日志
        log.info("管理端取消订单，订单id和取消原因为：{}", orderCancelDTO);

        // 参数校验

        // 调用service获取返回值，并给出响应
        if (orderService.cancelById(orderCancelDTO)) {
            return Result.success(MessageConstant.ORDER_CANCLE_BY_SHOP_SUCCESS);
        }
        return Result.error(MessageConstant.ORDER_CANCLE_BY_SHOP_FAIL);
    }

    /**
     * 派送订单（只有待派送的订单，才可以点击派送订单）
     *
     * @param id 订单id
     * @return 是否修改成功
     */
    @PutMapping("/delivery/{id}")
    public Result deliveryById(@PathVariable("id") Long id) {
        // 记录日志
        log.info("派送订单（只有待派送的订单，才可以点击派送订单），订单id为：{}", id);

        // 参数校验

        // 调用service获取返回值，并给出响应
        if (orderService.deliveryById(id)) {
            return Result.success(MessageConstant.ORDER_DELIVERY_SUCCESS);
        }
        return Result.error(MessageConstant.ORDER_DELIVERY_FAIL);
    }

    /**
     * 商家完成订单
     *
     * @param id 订单id
     * @return 是否成功完成
     */
    @PutMapping("/complete/{id}")
    public Result completeById(@PathVariable("id") Long id) {
        // 记录日志
        log.info("商家完成订单，商品id：{}", id);

        // 参数校验

        // 调用service获取返回值，并给出响应
        if (orderService.completeById(id)) {
            return Result.success(MessageConstant.ORDER_CONFIRM_SUCCESS);
        }
        return Result.error(MessageConstant.ORDER_CONFIRM_FAIL);
    }

}
